Skip to content

Get a bot out of the world when it embeds in it - #262

Merged
saworbit merged 2 commits into
mainfrom
bot-unstick
Sep 5, 2026
Merged

Get a bot out of the world when it embeds in it#262
saworbit merged 2 commits into
mainfrom
bot-unstick

Conversation

@saworbit

@saworbit saworbit commented Sep 5, 2026

Copy link
Copy Markdown
Owner

A bot whose origin is inside solid cannot walkmove in any direction, so it stands still until the match ends with no hold flag set to explain it. #257 caught one on dm2: Joe Rogan for 45 s at 2556 -414 24, reading SOLID in hull 0 at origin and eye height while every bot moving normally in the same edict dumps read EMPTY at both.

Detection and recovery

pointcontents reads hull 0, which is the test that separated him from the walkers, so it is the detector. Recovery follows the catchup warp's pattern: fog at both ends, setorigin, zero velocity, clear the route state.

The destination is a nav node, because navgen seats those at hull 1 standable origins, so a node is by construction a place a player fits. Nearest by distance only, deliberately not Argus_NearestNode: that prefers nodes it can see, and a traceline which starts in solid returns fraction 1, so from in here every node on the map looks visible and it could hand back one across the level.

The first cut was wrong and the ladder caught it

Contents plus a low instantaneous speed is not evidence of being stuck. dm4 teleported Romero 192 units down into the pit while he was running the walkway at 320 u/s, because a bot clips a thin edge for one tick and reads solid, and velocity at an apex means nothing.

Being inside solid and not having moved is the real signature, since an embedded bot never gets out on its own. Now three seconds inside solid without displacing 32 units.

Verified recovery, dm4

t 32.7   609 -139  -93   spd 325   EMPTY   running
t 33.3   574  -18 -296   spd   0   SOLID   fell in, embedded
t 33.8..36.1   identical position, motionless, inside solid
t 36.3   unstick fires
t 36.6   623   10 -296   spd  30   EMPTY   out
t 37.2   534  116 -296   spd 306   EMPTY   running normally

Three seconds instead of the rest of the match. Zero false positives across five tapes after the guard, against one in two tapes before it.

Parity

cells stalls
dm2 control 129, 71, 118 38, 199, 30
dm2 with unstick 102, 115, 122 46, 48, 29
dm4 with unstick 74, 72 20, 11

Logs a plain ARGUS <name> unstick <pos> line, beside shove and routecache adopt, because the ARGEVT verb set is closed.

Honest limits

The dm2 arm logged no firings at all, so the long freezes missing there are variance and not this. The one 27.3 s dm2 freeze that did occur is the other #257 signature, a bot in open space with no goal and a stale ar_pending, which this does not touch. And pointcontents cannot see a hull 1 wedge, where the world is empty but the player box does not fit.

Also here

--repeat N and --dump N for argus_edicts.py. A stochastic freeze will not sit still for a single dump; four dumps at 45 s intervals across two dm2 runs put one inside three separate freezes, which is how #257 was diagnosed at all.

Refs #257

🤖 Generated with Claude Code

Shane Wall and others added 2 commits September 5, 2026 16:14
A bot whose origin is inside solid cannot walkmove in any direction,
so it stands still until the match ends with no hold flag set to
explain it. #257 caught one on dm2: Joe Rogan for 45 s at
'2556 -414 24', reading SOLID in hull 0 at origin and eye height while
every bot moving normally in the same edict dumps read EMPTY at both.

pointcontents reads hull 0, which is the test that separated him from
the walkers, so it is the detector. Recovery follows the catchup
warp's pattern: fog at both ends, setorigin, zero velocity, clear the
route state.

THE DESTINATION IS A NAV NODE, because navgen seats those at hull 1
standable origins, so a node is by construction a place a player fits.
Nearest by DISTANCE ONLY, deliberately not Argus_NearestNode: that
prefers nodes it can see, and a traceline which STARTS in solid
returns fraction 1, so from in here every node on the map looks
visible and it could hand back one across the level.

THE FIRST CUT WAS WRONG AND THE LADDER CAUGHT IT. Contents plus a low
instantaneous speed is not evidence of being stuck: dm4 teleported
Romero 192 units down into the pit while he was running the walkway at
320 u/s, because a bot clips a thin edge for one tick and reads solid,
and velocity at an apex means nothing. Being inside solid AND NOT
HAVING MOVED is the real signature, since an embedded bot never gets
out on its own. Now three seconds inside solid without displacing 32
units.

VERIFIED RECOVERY, dm4:

  t 32.7   609 -139  -93   spd 325   EMPTY   running
  t 33.3   574  -18 -296   spd   0   SOLID   fell in, embedded
  t 33.8..36.1  identical position, motionless, inside solid
  t 36.3   unstick fires
  t 36.6   623   10 -296   spd  30   EMPTY   out
  t 37.2   534  116 -296   spd 306   EMPTY   running normally

Three seconds instead of the rest of the match. Zero false positives
across five tapes after the guard, against one in two tapes before it.

Parity elsewhere. dm2 cells 102, 115, 122 against a control of 129,
71, 118; dm4 cells 72 and 74 with stalls 11 and 20 against 17. Logs a
plain ARGUS <name> unstick <pos> line, beside shove and routecache
adopt, because the ARGEVT verb set is closed.

HONEST LIMITS. The dm2 arm logged no firings at all, so the long
freezes missing there are variance and not this. The one 27.3 s dm2
freeze that did occur is the other #257 signature, a bot in open space
with no goal and a stale ar_pending, which this does not touch. And
pointcontents cannot see a hull 1 wedge, where the world is empty but
the player box does not fit.

Refs #257

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A stochastic freeze will not sit still for a single dump. --repeat N
writes N dumps that far apart, and --dump N reads whichever one landed
inside the window.

That is what caught #257: four dumps at 45 s intervals across two dm2
runs put a dump inside three separate freezes, two of them long enough
to matter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 5, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-05T06:19:40.034041Z f7dc34c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@saworbit
saworbit merged commit e768bbd into main Sep 5, 2026
3 checks passed
@saworbit
saworbit deleted the bot-unstick branch September 5, 2026 06:17

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f7dc34c7df

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/argus.qc
Comment on lines +5445 to +5447
self.ar_node = world;
self.ar_pending = 0;
self.ar_mode = 0;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Rebuild routing from the recovery node

When an embedded bot has a normal valid item goal, this preserves ar_goal but clears both its node and pending route request. The later Argus_AI fallback treats mode 0 as direct seeking, so the rescued bot immediately beelines toward the goal through walls or hazards instead of routing from best; moreover, an existing an_busy search for this bot can subsequently install its pre-warp start node because the goal did not change. Cancel any in-flight search and re-arm routing after the teleport so recovery actually starts at the destination node.

Useful? React with 👍 / 👎.

Comment thread tools/argus_edicts.py
Comment on lines +60 to +63
if which is None or which >= len(starts):
which = len(starts) - 1
end = starts[which + 1] if which + 1 < len(starts) else len(text)
body = text[starts[which]:end]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject dump indexes outside the available range

When --dump is greater than the last index, this silently substitutes the final dump while the CLI still reports that it read the requested nonexistent index (for example, two dumps plus --dump 2 prints reading #2 but returns dump 1). Negative indexes are also accepted and can produce an empty reversed slice and a misleading no edicts dump error. Validate the requested zero-based index and fail explicitly instead of returning data from a different dump.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant